package cn.itrip.auth.service;

import cn.itrip.common.MD5;
import cn.itrip.common.RedisUtils;
import cn.itrip.common.UserAgentUtil;
import cn.itrip.pojo.ItripUser;
import cn.itrip.vo.TokenVO;
import com.alibaba.fastjson.JSON;
import cz.mallat.uasparser.OnlineUpdater;
import cz.mallat.uasparser.UASparser;
import cz.mallat.uasparser.UserAgentInfo;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.text.SimpleDateFormat;
import java.util.Date;

@Service
public class TokenServiceImpl implements TokenService {

    @Resource
    private RedisUtils redisUtils;

    /**
     * 生成token
     *
     * @param userAgent
     * @param user
     * @return
     * @throws Exception token格式
     *                   客户端标识-USERCODE-USERID-CREATIONDATE-RONDEM[6位]
     *                   token:PC-3066014fa0b10792e4a762-23-20170531133947-4f6496
     */
    @Override
    public TokenVO genToken(String userAgent, ItripUser user) throws Exception {
        //拼接token
        StringBuffer sb = new StringBuffer("token:");
        //初始化UASparser解析浏览器信息
        UASparser uaSparser = new UASparser(OnlineUpdater.getVendoredInputStream());
        //生成userAgent对象获取设备信息
        UserAgentInfo parse = uaSparser.parse(userAgent);
//            //获取设备类型
//            String deviceType = parse.getDeviceType();
//            System.out.println(deviceType);

        //判断是否为pc端 调用UserAgentUtil工具类CheckAgent（）方法
        if (!UserAgentUtil.CheckAgent(userAgent)) {
            sb.append("PC-");
        } else {
            sb.append("MOBILE-");
        }
        //用户名
        sb.append(MD5.getMd5(user.getUserCode(), 32) + "-");
        //用户ID
        sb.append(user.getId() + "-");
        //token生成时间
        sb.append(new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + "-");
        //随机生成6位数
        sb.append(MD5.getMd5(userAgent, 6));

        //转换
        String token=sb.toString();


        //封装token对象
        TokenVO tokenVO = new TokenVO();
        tokenVO.setToken(token);
        //拆分token
        String[] tokens = token.split("-");
        //生成时间
        long time = new SimpleDateFormat("yyyyMMddHHmmss").parse(tokens[3]).getTime();
        tokenVO.setGenTime(time);
        //startsWith()方法表示是否以token:PC-开头
        if (token.startsWith("token:PC-")) {
            tokenVO.setExpTime(time + 2 * 60 * 60 * 1000); //过期时间
//            tokenVO.setExpTime(time + 300); //过期时间
            redisUtils.setValueExpire(token, JSON.toJSONString(user), 2 * 60 * 60);
//            redisUtils.setValueExpire(token, JSON.toJSONString(user), 300);
        } else {
            tokenVO.setExpTime(Long.MAX_VALUE); //过期时间
            redisUtils.setValue(token, JSON.toJSONString(user));
        }

        return tokenVO;
    }

    @Override
    public Boolean deleteToken(String token) throws Exception {
        return redisUtils.del(token);
    }

    @Override
    public Boolean exit(String token) throws Exception {
        return redisUtils.exit(token);
    }

    @Override
    public long getTll(String token) throws Exception {
        return redisUtils.getTll(token);
    }

    @Override
    public String getValue(String token) throws Exception {
        return redisUtils.getValue(token);
    }

    @Override
    public boolean expire(String key) throws Exception {
        return redisUtils.expire(key);
    }
}
